vsftpdのインストール

概要:サーバーへのファイル転送用にFTPサーバーを構築する。ここでは、CentOS標準のFTPサーバーであるvsftpdを採用する。vsftpdはvery secure FTPDの略称である。
なお、ユーザ名、パスワード、CGI等に書かれたパスワード情報等の盗聴による不正入手対策として、SSLによる暗号化通信を行えるようにする。
また、管理者ユーザ以外は自身のホームディレクトリより上層へはアクセスできないようにする。

1. FTPサーバー構築(vsftpd)

  1. ) vsftpdインストール
    # yum list vsftpd ← vsftpdがあるか確認
    # yum -y install vsftpd ← vsftpdインストール
    
  2. ) vsftpd設定
    # vi /etc/vsftpd/vsftpd.conf ← vsftpd設定ファイル編集
    
        :
        :
    # Allow anonymous FTP? (Beware - allowed by default if you comment this out).
    anonymous_enable=NO ← anonymousユーザ(匿名ユーザ)のログイン禁止.NO ← YES
        :
    # The target log file can be vsftpd_log_file or xferlog_file.
    # This depends on setting xferlog_std_format parameter
    xferlog_enable=YES ← /var/log/vsftpd.logに接続・転送を記録(1/3).Default.
    #
    # Make sure PORT transfer connections originate from port 20 (ftp-data).
    connect_from_port_20=YES ← Default:Activeモード時のポート(変えてはいけない。)
        :
    # The name of log file when xferlog_enable=YES and xferlog_std_format=YES
    # WARNING - changing this filename affects /etc/logrotate.d/vsftpd.log
    xferlog_file=/var/log/vsftpd.log
      ← /var/log/vsftpd.logに接続・転送を記録(2/3).コメント外し & 変更
    #
    # Switches between logging into vsftpd_log_file and xferlog_file files.
    # NO writes to vsftpd_log_file, YES to xferlog_file
    xferlog_std_format=NO ← /var/log/vsftpd.logに接続・転送を記録(3/3).NO ← YES
        :
    # ASCII mangling is a horrible feature of the protocol.
    ascii_upload_enable=YES ← アスキーモードでのアップロードを許可. コメント外し
    ascii_download_enable=YES ← アスキーモードでのダウンロードを許可.コメント外し
    #
    # You may fully customise the login banner string:
    ftpd_banner=Welcome to blah FTP service.
      ← FTPログイン時にソフト名とバージョンが表示されないようにする.コメント外し
        :
    #
    # You may specify an explicit list of local users to chroot() to their home
    # directory. If chroot_local_user is YES, then this list becomes a list of
    # users to NOT chroot().
    chroot_local_user=YES
      ← デフォルトでホームディレクトリより上層へのアクセスを禁止する.追加
    chroot_list_enable=YES
      ← ホームディレクトリより上層へのアクセスを許可するユーザのリストの有効化.コメント外し
    # (default follows)
    chroot_list_file=/etc/vsftpd/chroot_list
      ← ホームディレクトリより上層へのアクセスを許可するユーザのリスト.コメント外し
    #
    # You may activate the "-R" option to the builtin ls. This is disabled by
    # default to avoid remote users being able to cause excessive I/O on large
    # sites. However, some broken FTP clients such as "ncftp" and "mirror" assume
    # the presence of the "-R" option, so there is a strong case for enabling it.
    ls_recurse_enable=YES ← ディレクトリごと削除できるようにする.コメント外し
        :
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    
    以下を最下行へ追加
    # local_root=public_html ← ログイン時のディレクトリを~/public_htmlにする
    # userlist_file=/etc/vsftpd/user_list
      ← アクセスを禁止するユーザを登録するファイル名
    # user_config_dir=/etc/vsftpd/user_conf
      ← ユーザごとにホームディレクトリを設定するファイルを置くディレクトリ指定
    use_localtime=YES ← タイムスタンプ時間を日本時間にする
    
    ----- PASVモード関係の設定の追加 -----
    PASVモードの場合1回目の通信で、2回目は何処に通信すれば良いのかをクライアント
    PCに教える。普通はNICに割り当てられているIPアドレスを自動取得してクライアント
    に教えるがルータなどでプライベートアドレスが割り振られている場合はプライベート
    アドレスを返してしまう場合がある。
    (何故かうまく行く時もある。)
    ドメインアドレスを使う場合はpasv_addr_resolveを必ず有効にすること。
    有効でない場合次のようなエラーが出る。
    500 OOPS: invalid pasv_address: //
    
    # PASV mode enable
    pasv_promiscuous=YES ← PASVモードを使用する場合の有効化
    
     [固定IPアドレスの場合以下1行を追加]
    pasv_address=ルータのWAN側IPアドレス
    
     [非固定IPアドレスでDDNSを使用している場合以下2行を追加]
    pasv_addr_resolve=YES ← PASVモード接続先IPアドレスをホスト名から取得する
    pasv_address=ドメインアドレス
      ← PASVモード接続先IPアドレスが牽けるホスト名※ ←重要
     [PASVモードの場合以下を追加]
    pasv_min_port=60000 ← PASVモード接続時の最小ポート番号
    pasv_max_port=60030 ← PASVモード接続時の最大ポート番号
    
    ----- SSL/TLS関係の設定の追加 -----
    # SSL/TLS enable
    ssl_enable=YES ← SSLを使用する場合の有効化
    rsa_cert_file=/etc/pki/tls/certs/vsftpd.pem ← サーバー証明書を指定
    
    ※pasv_addressには、サーバーのグローバルIPアドレスが牽けるホスト名を指定する。 なお、内部向けDNSサーバーを導入して内部からの名前解決時にプライベートIPアドレスに変換してしまっている場合は、新たにドメインを取得し、内部向けDNSに設定しないようにして、取得したドメイン名をpasv_addressに指定する。
     
  3. ) ホームディレクトリより上層へのアクセスを許可するユーザの登録
    # echo user名 >> /etc/vsftpd/chroot_list
    
    ※管理者や、自身のホームディレクトリ以外へアクセスできるようにしておく必要があるユーザのみ登録しておく
     
  4. ) FTPサーバーへのアクセスを禁止するユーザの登録
    # echo user名 >> /etc/vsftpd/ftpusers
    
  5. ) FTPサーバーへのアクセスを禁止するユーザの登録
    vsftpd.confの中で
    userlist_file=/etc/vsftpd/user_listの設定がある場合有効。
    userlist_enable=YES または userlist_deny=YESの設定がある場合はアクセスを禁止するユーザの登録となる。
    userlist_deny=NOの設定がある場合はアクセスを許可するユーザの登録となる。
    今回の場合はuserlist_fileがないので無効。
    また、userlist_enable=YESなので設定する場合はアクセスを禁止するユーザを登録する。
    # vi /etc/vsftpd/user_list
    
    ---ファイルの中身---
     # 色々ユーザが書いてありアクセスを禁止されるユーザが登録されている
    
  6. ) ユーザごとにホームディレクトリを設定する。
    vsftpd.confの中で
    user_config_dir=/etc/vsftpd/user_confの設定がある場合有効。
    # mkdir /etc/vsftpd/user_conf
    # cd /etc/vsftpd/user_conf
    # vi developer(ユーザ名)
    
    local_root=/home/html/developer(FTPのホームディレクトリパス)
    
  7. ) サーバー証明書作成
    # cd /etc/pki/tls/certs/ ← ディレクトリ移動
    # make vsftpd.pem ← サーバー証明書作成
    
    umask 77 ; \
            PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
            PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
            /usr/bin/openssl req -utf8 -newkey rsa:1024 -keyout $PEM1 -nodes -x509
     -days 365 -out $PEM2 -set_serial 0 ; \
            cat $PEM1 >  vsftpd.pem ; \
            echo ""    >> vsftpd.pem ; \
            cat $PEM2 >> vsftpd.pem ; \
            rm -f $PEM1 $PEM2
    Generating a 1024 bit RSA private key
    ........................++++++
    ......++++++
    writing new private key to '/tmp/openssl.jz3379'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [GB]:JP ← 国名
    State or Province Name (full name) [Berkshire]:都道府県名 ← 都道府県名
    Locality Name (eg, city) [Newbury]:市区町村名 ← 市区町村名
    Organization Name (eg, company) [My Company Ltd]:組織名 ← 組織名(なんでもいい)
    Organizational Unit Name (eg, section) []: ← 空ENTER
    Common Name (eg, your name or your server's hostname) []:ホスト名 ← ホスト名
    Email Address []:root@localhost ← 管理者メールアドレス
    
    注:ホスト名をhostsに登録し、修正があった場合はvsftpd.pemを再作成し、vsftpdを再起動する。
     
  8. ) PASVモード の設定(SSLを使わない場合のみ対応)
    ip_conntrack_ftpがロードされている必要がある。
    ロードされているか確認するには
    # lsmod | grep ftp
    
    何もでない場合、/etc/sysconfig/iptables-config に以下のようにip_conntrack_ftpを追記する。
    # vi /etc/sysconfig/iptables-config
    
    IPTABLES_MODULES="ip_conntrack_netbios_ns ip_conntrack_ftp"
    
    iptablesを再起動する。
    # /etc/rc.d/init.d/iptables restart
    
  9. ) Firewallに穴を開ける 注:ファイアウォール構築の章で設定済
    # iptables -I RH-Firewall-1-INPUT -p tcp -m tcp --dport 60000:60030 -j ACCEPT_COUNTRY
    # iptables -I RH-Firewall-1-INPUT -p tcp -m tcp --dport ftp -j ACCEPT_COUNTRY
    # /etc/rc.d/init.d/iptables save ← 設定保存
    
  10. ) vsftpd起動
    # /etc/rc.d/init.d/vsftpd restart ← vsftpd再起動
    vsftpd 用の vsftpd を起動中:                               [  OK  ]
    
    # chkconfig vsftpd on ← vsftpd自動起動設定
    # chkconfig --list vsftpd ← vsftpd自動起動設定確認
    vsftpd          0:off   1:off   2:on    3:on    4:on    5:on    6:off
      ← ランレベル2~5のon確認
    
  11. ) ポート21番のネットワーク上のOPEN
    ネットワーク上でTCP/IPの21番ポートが開いていること。(サーバー、クライアント、ルーターなどのファイヤーウォールやセキュリティー設定で OPENされていること。)
  12. ) PASV接続用ポートのネットワーク上のOPEN
    ネットワーク上でTCP/IPのPASV接続用ポート(60000~60030)が開いていること。(サーバー、クライアント、ルーターなどのファイヤーウォールやセキュリティー設定で OPENされていること。)
  13. ) アクセス制限 vsftpdへアクセスできるホストを制限する。
    # echo "vsftpd:127.0.0.1" >> /etc/hosts.allow
      ← サーバー自身からのvsftpdへのアクセスを許可
    # echo "vsftpd:192.168.100." >> /etc/hosts.allow
      ← 内部(例:192.168.100.XXXからのvsftpdへのアクセスを許可)
    # echo "vsftpd:.ppp.asahi-net.or.jp"  >> /etc/hosts.allow
     ← 外部(例:xxx.ppp.asahi-net.or.jpからのvsftpdへのアクセスを許可)
    # echo "vsftpd:ALL" >> /etc/hosts.deny ← vsftpdへの全てのアクセスを禁止
    
    注:上記では、内部(例:192.168.1.XXX)と外部(例:xxx.ppp.asahi-net.or.jp)からのみ、vsftpdへのアクセスを許可している

最終更新のRSS
Last-modified: 2014-03-11 (火) 01:59:57 (3700d)